import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * Thread de réception des messages provenant du système linux
 * @author H4201
 *
 */
public class WindowsReception extends Thread {
	
	/**
	 * Socket utilisé pour la communication
	 */
	private static Socket socket;
	
	/**
	 * Controleur de l'application
	 */
	private ControleurFenetrePrincipale ctrl;
	
	/**
	 * Permet l'arrêt du thread
	 */
	private static boolean stop;
	
	/**
	 * Buffer de lecture
	 */
	private BufferedReader plec;
	
	/**
	 * Constructeur de WindowsReception
	 * @param ctrl Controleur du thread
	 * @param s Socket utilisé
	 */
	public WindowsReception(ControleurFenetrePrincipale ctrl, Socket s) {
		this.ctrl = ctrl;
		socket = s;
		stop = false;
	}
	
	/**
	 * Désérialize un message
	 * @param message Message à désérializer
	 * @return Tableau de chaines de caractère qui composent le message
	 */
	protected String[] deserializer (String message) {
		String delims = "[ ]+";
		return message.split(delims);
	}
	
	/**
	 * Arrêt du thread en cours
	 */
	public static void arret () {
		stop = true;
		try {
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Fermeture du buffer à la fermeture
	 */
	private void fermeture () {
		try {
			plec.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Action effectuée par le thread.
	 * Lecture d'un message sur le socket et effectuer une action en conséquence.
	 */
	public void run() {
		try {
			plec = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		    String str = "";
		    while(!stop) {
		       str = plec.readLine(); 
		       if (str != null) {
		    	   System.out.println("Reçu : " + str);
			       String[] tokens = deserializer (str);
			       if (tokens[0].equals("0")){
			     	   ctrl.addErreur(0);
			       }
			       else if (tokens[0].equals("1")){
			     	   ctrl.addErreur(1);
			       }
			       else if (tokens[0].equals("2")){
			      	   ctrl.addErreur(2);
			       }
			       else if (tokens[0].equals("3")){
			       	   ctrl.addErreur(3);
			       }
			       else if (tokens[0].equals("4")){
			      	   ctrl.addErreur(4);
			       }
			       else if (tokens[0].equals("5")){
			      	   ctrl.addErreur(5);
			       }
			       else if (tokens[0].equals("6")){
			      	   ctrl.addErreur(6);
			       }
			       else if (tokens[0].equals("7")){
			     	   ctrl.addErreur(7);
			       }
			       else if (tokens[0].equals("8")){
			       	   ctrl.erreurRetrait();
			       }
			       else if (tokens[0].equals("101")){
			      	   System.out.println("Initialisation");
			      	   ctrl.addLog("Initialisation achevée");
			       	   ctrl.lancementProduction();
			       }
			       else if (tokens[0].equals("102")){
			       	   System.out.println("Lancement de la production");
			      	   try{
			      		   ctrl.addLog("Lancement de la production de " + ctrl.intToType(tokens[1]));
			       	   }
			       	   catch (Exception e){
			       		   System.out.println(e);
			       	   }
			       }
			       else if (tokens[0].equals("103")){
			      	   System.out.println("Arret systeme");
			       	   ctrl.addLog("Arrêt du système");
			       	   ctrl.arret();
			    	   fermeture();
			       	   arret();
			       }
			       else if (tokens[0].equals("104")){
			      	   System.out.println("Arret en mode dégradé");
			       	   ctrl.addLog("Arrêt en mode dégradé");
			       }
			       else if (tokens[0].equals("105")){
			       	   System.out.println("Passage d'un carton à l'imprimante");
			       	   try{
			       		   ctrl.addLog("Passage d'un carton à l'imprimante\nLot : " + tokens[1] + "\nCarton : " + tokens[2] + 
			       				   "\nNb pièces : " + tokens[3] + "\nCode Opérateur : " + tokens[4] + "\nType pièces : " + ctrl.intToType(tokens[5]) +
			        			   "\nTaux Rebut : " + Double.parseDouble(tokens[6])/100.00 +"%");
			           }
			           catch (Exception e){
			        	   System.out.println(e);
			           }
			       }
			       else if (tokens[0].equals("106")){
			       	   System.out.println("Passage d'un carton vers l'empalettage");
			       	   try{
			       		   ctrl.addLog("Passage d'un carton vers l'empalettage\nLot : " + tokens[1] + "\nCarton : " + tokens[2] + 
			       				   "\nType pièces : " + ctrl.intToType(tokens[3]));
			       	   }
			       	   catch (Exception e){
			       		   System.out.println(e);
			       	   }
			       }
			       else if (tokens[0].equals("107")){
			      	   System.out.println("Envoi d'une palette vers le stockage");
			       	   try{
			      		   ctrl.addLog("Envoi d'une palette vers le stockage\nLot : " + tokens[1] + "\nType pièces : " + ctrl.intToType(tokens[2]) + 
			       				   "\nN°palette : " + tokens[3]);
			       	   }
			       	   catch (Exception e){
			       		   System.out.println(e);
			       	   }
			       }
			       else if (tokens[0].equals("109")){
			       	   System.out.println("Fin du lot");
			       	   try{
			        	   ctrl.addLog("Fin du lot de " + tokens[2] + " N°" + tokens[1]);
			        	   ctrl.finLot();
			       	   }
			       	   catch (Exception e){
			       		   System.out.println(e);
			       	   }
			       }
			       else if (tokens[0].equals("110")){
			       	   System.out.println("Stockage Réussi");
			       	   try{
			       		   ctrl.addLog("Stockage de la palette N°" + tokens[3] + " de " + ctrl.intToType(tokens[2]) + " du lot " + tokens[1]);
			       	   }
			       	   catch (Exception e){
			       		   System.out.println(e);
			       	   }
			       }
			       else if (tokens[0].equals("111")){
			       	   try{
			       		  ctrl.retraitReussi("Retrait effectué\nNb palette A : " + tokens[1] + "\nNb palette B : " + tokens[2] + 
			       				   "\nQuai d'expédition: " + tokens[3]);
			       	   }
			       	   catch (Exception e){
			       		   System.out.println(e);
			       	   }
			       }
			       else if (tokens[0].equals("112")){
			       	   ctrl.addLog("Erreurs réparées");
			       	   ctrl.erreurReparees();
			       }
			       else if (tokens[0].equals("115")){
			       	   System.out.println("Arret du lot en cours");
			       	   ctrl.addLog("Arrêt du lot en cours");
			       	   ctrl.finLot();
			       }
		       }
		    }
		    
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			fermeture();
		}
	}
}

     